package com.touni.codeoptimization.tabledrivenmethod;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName : TableDrivenDemo
 * @Description : 表驱动法 ：编程模式 ，从表里面查找信息而不使用逻辑语句
 * @Author : lwq
 * @Date: 2020-11-28 14:11
 */
public class TableDrivenDemo {



    //demo  1.对字符进行分类 分为字母 数字 特殊符号
    //1.复杂条件判断逻辑
    public static void complexClassifiedStr(char input){
        if (('a' <= input && input <= 'z') || ('A' <= input && input <= 'Z')){
            System.out.println("this is a letter");
        }else if ('0' <= input && input <= '9'){
            System.out.println("this is a number");
        }else {
            System.out.println("this is a special char");
        }
    }

    //2.将复杂逻辑判断转换为表数据  表存放内容以及表数据大小
    public static void simpleTableClassifiedStr(char input){
        //构造一个容器 存放字符跟类型之间的关系
        Map<Character,String> table = new HashMap<>();
        table.put('a',"this is a letter");
        table.put('b',"this is a letter");
        table.put('8',"this is a number");
        // ...........依次类推

        //使用该容器 替换复杂的逻辑判断语句---此处显示的特别不切实际
        System.out.println(table.get(input));
    }

    // demo 2 获取每个月的天数  复杂写法 使用逻辑判断语句 switch/if语句
    public static void complexDaysPerMonth(int month,int leapYearSign){
        int days;
        switch (month){
            case 1 :
            case 3 :
            case 5 :
            case 7 :
            case 8 :
            case 10 :
            case 12 :
                days = 31;break;
            case 2 : days = 28;break;
            case 4 :
            case 6 :
            case 9 :
            case 11 :
                days = 30;break;
            default: throw new RuntimeException("输入月份不合法");
        }
        System.out.println(days + leapYearSign);
    }

    // 优化方法 灵活利用数组等数据结构 带有天然的索引下标   leapYearSign=0非闰年 1闰年
    public static void simpleDaysPerMonth(int month,int leapYearSign){
        int[] daysPerMonth = {31,28,31,30,31,30,31,31,30,31,30,31};
        if (month == 2){
            System.out.println(daysPerMonth[month -1] + leapYearSign);
        }
        // todo 加上闰年后怎么处理
        System.out.println(daysPerMonth[month -1]);
    }


    public static void main(String[] args) {
        //complexClassifiedStr('9');
        //System.out.println("============================");
        //simpleTableClassifiedStr('8');
        complexDaysPerMonth(5,0);
        System.out.println("=================");
        simpleDaysPerMonth(5,1);

    }

}
